# 将可能发生错误的代码放在异常的代码语句中
# 异常可以执行某些可能发生错误的代码，
# 从而选择另一个不会发生错误的代码执行
# 异常语法：
"""try:
    pass  # 可能发生错误的代码
except:
    pass  # 捕获到异常则执行这里de代码

# except:   # 捕获异常
# except 异常类型:   # 捕获单个异常类型
# except （异常类型1，异常类型2...）:   #捕获多个异常类型,元组形式
# except Exception:    # 捕获所有异常，Exception是所有程序异常的父类
# except Exception as 变量:   # 捕获异常通过as获取异常信息存储在变量中

else:
    pass  # 如果没有异常则执行这里的代码
finally:
    pass  # 不过有没有异常都会执行的代码
"""

# 捕获单个异常
"""try:
    print(num)   # num没有定义 会报错，不想程序报错则使用异常来检查
except NameError as result:   # 捕获异常类型NameError 通过as将异常信息存储在变量result中
    print(result)
"""
# 捕获多个异常 元组形式写多个异常类型
"""try:
    print(1/0)   # 除数不能为0 会报错，不想程序报错则使用异常来检查
except (NameError, ZeroDivisionError) as result:   # 捕获异常类型（NameError，ZeroDivisionError ）通过as将异常信息存储在变量result中
    print(result)
"""
# 捕获所有异常的父类 Exception
"""try:
    print(1/0)   # 除数不能为0 会报错，不想程序报错则使用异常来检查
except Exception as result:   # 捕获所有异常的父类Exception， 通过as将异常信息存储在变量result中
    print(result)
"""

# 异常嵌套应用 尝试以r形式打开一个文件，如果文件不存在，提示用户
# 如果文件打开成功，则进行读取文件内容，在读取文件内容过程中可能发生异常，所以嵌套一层异常代码
"""import time   # 导入时间模块（需要用到一个延迟输出）
try:
    f = open('3.txt', 'r')    
except:   # 捕获异常
    print('文件不存在！')
else:   # 没有异常执行下面代码
    try:    # 异常嵌套
        while True:   # 循环读取文件内容
            con = f.readline()   # 行方式读取文件
            if len(con) == 0:
                break    # 读取完成 退出当前循环
            time.sleep(3)   # 3s后执行后面代码
            print(con)
    except:     # 读取文件中捕获异常
        # 在终端执行时 如果按下ctrl+c 就会中止程序运行
        # 这时候except就可以捕获到这个中止de异常
        print('程序被意外中止了!')
    finally:    # 不管有没有异常都执行
        f.close()   # 关闭文件
        print('文件已关闭!') 
"""
# 自定义异常类 继承异常父类 Exception
"""class xxxErro(Exception):
    def __str__(self):   # 异常显示的信息
        return '异常信息'
# 如果需要用到自定义的异常类 通过raise抛出异常
try:
    pass
    raise xxxErro()   # 抛出自定义的异常类
except Exception as result:   # result变量接收到de信息就是__str__魔法函数中return的内容
    print(result)
"""

# 自定义一个密码长度异常类
class PassworldlenErro(Exception):
    def __init__(self, input_len, min_len):
        self.input_len = input_len
        self.min_len = min_len

    def __str__(self):   # 异常显示的信息
        return f'您输入的密码长度是：{self.input_len}，密码最小长度是：{self.min_len}'

pass_len = 6
def main():
    try:
        password = input('请输入你的密码：')
        if len(password) < pass_len:   # 如果用户输入密码小于最小长度，则抛出异常
            raise PassworldlenErro(password, pass_len)  # 通过raise抛出自定义的异常
    except Exception as result:   # 捕获异常（因为自定义异常类继承了Exception父类，所以我们可以接收到通过raise抛出的异常信息）
        print(result)
    else:
        print('输入密码成功！')

main()